#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/*
    通过信号灯同步两个非亲缘关系进程
    client端先启动，等server端输出十条语句后client端才运行
*/

union semun {
    int              val;    /* Value for SETVAL */
    struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
    unsigned short  *array;  /* Array for GETALL, SETALL */
    struct seminfo  *__buf;  /* Buffer for IPC_INFO
                                (Linux-specific) */
};

int main(int argc, char *argv[])
{
    /*初始化信号量集*/
    int key, semid;
    key = ftok("./a.c", 1);
    //初始化一个有3个信号量的信号集
    semid = semget(key, 3, IPC_CREAT | 0777);
    if(semid < 0){
        printf("server信号灯初始化失败!\n");
        return -1;
    }
    printf("server信号灯初始化成功!，semid = %d\n", semid);

    //查看信号集
    system("ipcs -s");

    /*初始化信号*/
    union semun mysemun;
    mysemun.val = 0;  
    //设置第2个信号（1）
    semctl(semid, 1, SETVAL, mysemun);

    /*打印十条语句*/
    for(int i=0;i<10;i++){
        printf("server\n");
    }

    /*分配信号*/
    //设置操作信号的方式（P或V）
    struct sembuf sops;
    sops.sem_num = 1;  //要操作的信号量编号
    sops.sem_flg = 0;  //阻塞操作
    sops.sem_op = 1;  //分配资源 V操作
    semop(semid, &sops, 1);  // 1:操作的信号数为1

    return 0;
}

